// $G $D/$F.go && $L $F.$A && ./$A.out

// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import	"rand"

const	Count	= 1e5

func
i64rand() int64
{
	for {
		a := int64(rand.Uint32());
		a = (a<<32) | int64(rand.Uint32());
		a >>= uint(rand.Intn(64));
		if -a != a {
			return a;
		}
	}
	return 0;	// impossible
}

func
i64test(a,b,c int64)
{
	d := a%c;
	if d != b {
		panicln("i64", a, b, c, d);
	}
}

func
i64run()
{
	var a, b int64;

	for i:=0; i<Count; i++ {
		a = i64rand();

		b = a%1;	i64test(a,b,1);
		b = a%2;	i64test(a,b,2);
		b = a%3;	i64test(a,b,3);
		b = a%4;	i64test(a,b,4);
		b = a%5;	i64test(a,b,5);
		b = a%6;	i64test(a,b,6);
		b = a%7;	i64test(a,b,7);
		b = a%8;	i64test(a,b,8);
		b = a%10;	i64test(a,b,10);
		b = a%16;	i64test(a,b,16);
		b = a%20;	i64test(a,b,20);
		b = a%32;	i64test(a,b,32);
		b = a%60;	i64test(a,b,60);
		b = a%64;	i64test(a,b,64);
		b = a%128;	i64test(a,b,128);
		b = a%256;	i64test(a,b,256);
		b = a%16384;	i64test(a,b,16384);

		b = a%-1;	i64test(a,b,-1);
		b = a%-2;	i64test(a,b,-2);
		b = a%-3;	i64test(a,b,-3);
		b = a%-4;	i64test(a,b,-4);
		b = a%-5;	i64test(a,b,-5);
		b = a%-6;	i64test(a,b,-6);
		b = a%-7;	i64test(a,b,-7);
		b = a%-8;	i64test(a,b,-8);
		b = a%-10;	i64test(a,b,-10);
		b = a%-16;	i64test(a,b,-16);
		b = a%-20;	i64test(a,b,-20);
		b = a%-32;	i64test(a,b,-32);
		b = a%-60;	i64test(a,b,-60);
		b = a%-64;	i64test(a,b,-64);
		b = a%-128;	i64test(a,b,-128);
		b = a%-256;	i64test(a,b,-256);
		b = a%-16384;	i64test(a,b,-16384);
	}
}

func
u64rand() uint64
{
	a := uint64(rand.Uint32());
	a = (a<<32) | uint64(rand.Uint32());
	a >>= uint(rand.Intn(64));
	return a;
}

func
u64test(a,b,c uint64)
{
	d := a%c;
	if d != b {
		panicln("u64", a, b, c, d);
	}
}

func
u64run()
{
	var a, b uint64;

	for i:=0; i<Count; i++ {
		a = u64rand();

		b = a%1;	u64test(a,b,1);
		b = a%2;	u64test(a,b,2);
		b = a%3;	u64test(a,b,3);
		b = a%4;	u64test(a,b,4);
		b = a%5;	u64test(a,b,5);
		b = a%6;	u64test(a,b,6);
		b = a%7;	u64test(a,b,7);
		b = a%8;	u64test(a,b,8);
		b = a%10;	u64test(a,b,10);
		b = a%16;	u64test(a,b,16);
		b = a%20;	u64test(a,b,20);
		b = a%32;	u64test(a,b,32);
		b = a%60;	u64test(a,b,60);
		b = a%64;	u64test(a,b,64);
		b = a%128;	u64test(a,b,128);
		b = a%256;	u64test(a,b,256);
		b = a%16384;	u64test(a,b,16384);
	}
}

func
i32rand() int32
{
	for {
		a := int32(rand.Uint32());
		a >>= uint(rand.Intn(32));
		if -a != a {
			return a;
		}
	}
	return 0;	// impossible
}

func
i32test(a,b,c int32)
{
	d := a%c;
	if d != b {
		panicln("i32", a, b, c, d);
	}
}

func
i32run()
{
	var a, b int32;

	for i:=0; i<Count; i++ {
		a = i32rand();

		b = a%1;	i32test(a,b,1);
		b = a%2;	i32test(a,b,2);
		b = a%3;	i32test(a,b,3);
		b = a%4;	i32test(a,b,4);
		b = a%5;	i32test(a,b,5);
		b = a%6;	i32test(a,b,6);
		b = a%7;	i32test(a,b,7);
		b = a%8;	i32test(a,b,8);
		b = a%10;	i32test(a,b,10);
		b = a%16;	i32test(a,b,16);
		b = a%20;	i32test(a,b,20);
		b = a%32;	i32test(a,b,32);
		b = a%60;	i32test(a,b,60);
		b = a%64;	i32test(a,b,64);
		b = a%128;	i32test(a,b,128);
		b = a%256;	i32test(a,b,256);
		b = a%16384;	i32test(a,b,16384);

		b = a%-1;	i32test(a,b,-1);
		b = a%-2;	i32test(a,b,-2);
		b = a%-3;	i32test(a,b,-3);
		b = a%-4;	i32test(a,b,-4);
		b = a%-5;	i32test(a,b,-5);
		b = a%-6;	i32test(a,b,-6);
		b = a%-7;	i32test(a,b,-7);
		b = a%-8;	i32test(a,b,-8);
		b = a%-10;	i32test(a,b,-10);
		b = a%-16;	i32test(a,b,-16);
		b = a%-20;	i32test(a,b,-20);
		b = a%-32;	i32test(a,b,-32);
		b = a%-60;	i32test(a,b,-60);
		b = a%-64;	i32test(a,b,-64);
		b = a%-128;	i32test(a,b,-128);
		b = a%-256;	i32test(a,b,-256);
	}
}

func
u32rand() uint32
{
	a := uint32(rand.Uint32());
	a >>= uint(rand.Intn(32));
	return a;
}

func
u32test(a,b,c uint32)
{
	d := a%c;
	if d != b {
		panicln("u32", a, b, c, d);
	}
}

func
u32run()
{
	var a, b uint32;

	for i:=0; i<Count; i++ {
		a = u32rand();

		b = a%1;	u32test(a,b,1);
		b = a%2;	u32test(a,b,2);
		b = a%3;	u32test(a,b,3);
		b = a%4;	u32test(a,b,4);
		b = a%5;	u32test(a,b,5);
		b = a%6;	u32test(a,b,6);
		b = a%7;	u32test(a,b,7);
		b = a%8;	u32test(a,b,8);
		b = a%10;	u32test(a,b,10);
		b = a%16;	u32test(a,b,16);
		b = a%20;	u32test(a,b,20);
		b = a%32;	u32test(a,b,32);
		b = a%60;	u32test(a,b,60);
		b = a%64;	u32test(a,b,64);
		b = a%128;	u32test(a,b,128);
		b = a%256;	u32test(a,b,256);
		b = a%16384;	u32test(a,b,16384);
	}
}

func
i16rand() int16
{
	for {
		a := int16(rand.Uint32());
		a >>= uint(rand.Intn(16));
		if -a != a {
			return a;
		}
	}
	return 0;	// impossible
}

func
i16test(a,b,c int16)
{
	d := a%c;
	if d != b {
		panicln("i16", a, b, c, d);
	}
}

func
i16run()
{
	var a, b int16;

	for i:=0; i<Count; i++ {
		a = i16rand();

		b = a%1;	i16test(a,b,1);
		b = a%2;	i16test(a,b,2);
		b = a%3;	i16test(a,b,3);
		b = a%4;	i16test(a,b,4);
		b = a%5;	i16test(a,b,5);
		b = a%6;	i16test(a,b,6);
		b = a%7;	i16test(a,b,7);
		b = a%8;	i16test(a,b,8);
		b = a%10;	i16test(a,b,10);
		b = a%16;	i16test(a,b,16);
		b = a%20;	i16test(a,b,20);
		b = a%32;	i16test(a,b,32);
		b = a%60;	i16test(a,b,60);
		b = a%64;	i16test(a,b,64);
		b = a%128;	i16test(a,b,128);
		b = a%256;	i16test(a,b,256);
		b = a%16384;	i16test(a,b,16384);

		b = a%-1;	i16test(a,b,-1);
		b = a%-2;	i16test(a,b,-2);
		b = a%-3;	i16test(a,b,-3);
		b = a%-4;	i16test(a,b,-4);
		b = a%-5;	i16test(a,b,-5);
		b = a%-6;	i16test(a,b,-6);
		b = a%-7;	i16test(a,b,-7);
		b = a%-8;	i16test(a,b,-8);
		b = a%-10;	i16test(a,b,-10);
		b = a%-16;	i16test(a,b,-16);
		b = a%-20;	i16test(a,b,-20);
		b = a%-32;	i16test(a,b,-32);
		b = a%-60;	i16test(a,b,-60);
		b = a%-64;	i16test(a,b,-64);
		b = a%-128;	i16test(a,b,-128);
		b = a%-256;	i16test(a,b,-256);
		b = a%-16384;	i16test(a,b,-16384);
	}
}

func
u16rand() uint16
{
	a := uint16(rand.Uint32());
	a >>= uint(rand.Intn(16));
	return a;
}

func
u16test(a,b,c uint16)
{
	d := a%c;
	if d != b {
		panicln("u16", a, b, c, d);
	}
}

func
u16run()
{
	var a, b uint16;

	for i:=0; i<Count; i++ {
		a = u16rand();

		b = a%1;	u16test(a,b,1);
		b = a%2;	u16test(a,b,2);
		b = a%3;	u16test(a,b,3);
		b = a%4;	u16test(a,b,4);
		b = a%5;	u16test(a,b,5);
		b = a%6;	u16test(a,b,6);
		b = a%7;	u16test(a,b,7);
		b = a%8;	u16test(a,b,8);
		b = a%10;	u16test(a,b,10);
		b = a%16;	u16test(a,b,16);
		b = a%20;	u16test(a,b,20);
		b = a%32;	u16test(a,b,32);
		b = a%60;	u16test(a,b,60);
		b = a%64;	u16test(a,b,64);
		b = a%128;	u16test(a,b,128);
		b = a%256;	u16test(a,b,256);
		b = a%16384;	u16test(a,b,16384);
	}
}

func
i8rand() int8
{
	for {
		a := int8(rand.Uint32());
		a >>= uint(rand.Intn(8));
		if -a != a {
			return a;
		}
	}
	return 0;	// impossible
}

func
i8test(a,b,c int8)
{
	d := a%c;
	if d != b {
		panicln("i8", a, b, c, d);
	}
}

func
i8run()
{
	var a, b int8;

	for i:=0; i<Count; i++ {
		a = i8rand();

		b = a%1;	i8test(a,b,1);
		b = a%2;	i8test(a,b,2);
		b = a%3;	i8test(a,b,3);
		b = a%4;	i8test(a,b,4);
		b = a%5;	i8test(a,b,5);
		b = a%6;	i8test(a,b,6);
		b = a%7;	i8test(a,b,7);
		b = a%8;	i8test(a,b,8);
		b = a%10;	i8test(a,b,10);
		b = a%8;	i8test(a,b,8);
		b = a%20;	i8test(a,b,20);
		b = a%32;	i8test(a,b,32);
		b = a%60;	i8test(a,b,60);
		b = a%64;	i8test(a,b,64);
		b = a%127;	i8test(a,b,127);

		b = a%-1;	i8test(a,b,-1);
		b = a%-2;	i8test(a,b,-2);
		b = a%-3;	i8test(a,b,-3);
		b = a%-4;	i8test(a,b,-4);
		b = a%-5;	i8test(a,b,-5);
		b = a%-6;	i8test(a,b,-6);
		b = a%-7;	i8test(a,b,-7);
		b = a%-8;	i8test(a,b,-8);
		b = a%-10;	i8test(a,b,-10);
		b = a%-8;	i8test(a,b,-8);
		b = a%-20;	i8test(a,b,-20);
		b = a%-32;	i8test(a,b,-32);
		b = a%-60;	i8test(a,b,-60);
		b = a%-64;	i8test(a,b,-64);
		b = a%-128;	i8test(a,b,-128);
		b = a%-101;	i8test(a,b,-101);
	}
}

func
u8rand() uint8
{
	a := uint8(rand.Uint32());
	a >>= uint(rand.Intn(8));
	return a;
}

func
u8test(a,b,c uint8)
{
	d := a%c;
	if d != b {
		panicln("u8", a, b, c, d);
	}
}

func
u8run()
{
	var a, b uint8;

	for i:=0; i<Count; i++ {
		a = u8rand();

		b = a%1;	u8test(a,b,1);
		b = a%2;	u8test(a,b,2);
		b = a%3;	u8test(a,b,3);
		b = a%4;	u8test(a,b,4);
		b = a%5;	u8test(a,b,5);
		b = a%6;	u8test(a,b,6);
		b = a%7;	u8test(a,b,7);
		b = a%8;	u8test(a,b,8);
		b = a%10;	u8test(a,b,10);
		b = a%8;	u8test(a,b,8);
		b = a%20;	u8test(a,b,20);
		b = a%32;	u8test(a,b,32);
		b = a%60;	u8test(a,b,60);
		b = a%64;	u8test(a,b,64);
		b = a%127;	u8test(a,b,127);
	}
}

func
main()
{
	xtest();
	i64run();
	u64run();
	i32run();
	u32run();
	i16run();
	u16run();
	i8run();
	u8run();
}

func
xtest()
{
}
